/*
    全局测试套件的使用
*/
#include <iostream>
#include <vector>
#include "gtest/gtest.h"

// 全局测试环境类(全局测试套件/全局时间机制)
// 针对整个测试程序，提供全局事件机制，在所有的测试函数之前进行数据的初始化，在测试函数结束后进行数据的清理
std::vector<int> global_vector;
class GlobalEnvironment : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        std::cout << "GlobalEnvironment: 全局测试环境初始化" << std::endl;
        global_vector.push_back(1); // 所有的测试用例共享全局设置
    }

    virtual void TearDown() override
    {
        std::cout << "GlobalEnvironment: 全局测试环境清理" << std::endl;
        global_vector.clear();
    }

public:
    std::vector<int> _vector; // 内部成员无法直接在测试函数中使用，一半对于全局测试环境不需要局部变量
};

TEST(GlobalTest, Test1)
{
    std::cout << "GlobalTest: 测试用例1开始..." << std::endl;
    global_vector.push_back(1); // 共享全局global_vector
    global_vector.push_back(2);
    ASSERT_EQ(global_vector.size(), 3);
    std::cout << "GlobalTest: 测试用例1结束..." << std::endl;
}

TEST(GlobalTest, Test2)
{
    std::cout << "GlobalTest: 测试用例2开始..." << std::endl;
    global_vector.push_back(1); // 共享全局global_vector
    global_vector.push_back(2);
    ASSERT_EQ(global_vector.size(), 2);
    std::cout << "GlobalTest: 测试用例2结束..." << std::endl;
}

TEST(GlobalEnvironment, Test1)
{
    // 在普通的测试用例函数中不能直接访问全局测试环境类中的内部成员
    // 测试函数中没有该类实例的引用或指针
    // _vector.push_back(1);

    std::cout << "GlobalEnvironment: 测试用例1开始..." << std::endl;
    global_vector.push_back(1); // 共享全局global_vector
    global_vector.push_back(2);
    ASSERT_EQ(global_vector.size(), 2);
    std::cout << "GlobalEnvironment: 测试用例1结束..." << std::endl;
}

int main(int argc, char* argv[]) 
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new GlobalEnvironment); // 向框架中注册注册一个全局测试环境对象
    RUN_ALL_TESTS();
    return 0;
}